package com.tecode.myBooks.product.servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.List;

/**
 * Created with Intellij IDEA.
 *
 * @Author: Gabriel
 * @Date: 2018-12-14
 * @Description:
 */
@WebServlet("/productEditServlet")
public class ProductEditServlet extends HttpServlet {
/**
 * @Author Gabriel
 * @Description //TODO 文件的下载  是从服务器中下载一个文件的到客户端
 * @Date 2018/12/14
 * @Param [req, resp]
 * @Return void
 */
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			//1.确定需要下载的文件在服务器的地址。
				File file = new File("d:\\张三.jar");


			//2.获得需要下载文件的输入流。
			InputStream is = new FileInputStream(file);

			//3.文件是需要下载给客户端的。所以需要把文件的内容响应给客户端，响应对象来获得输出流。
		     OutputStream os = resp.getOutputStream();

		//默认情况下，响应的内容会在浏览器中进行展示输出的内容。所以下载时  需要改变浏览器的默认处理行为。
		resp.setHeader("Content-Type","application/x-msdownload");
		//URLDecoder.decode()  解码
		//设置响应时默认的文件名
		resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(file.getName(),"UTF-8"));

			//4.把读取到的文件响应给客户端，使用流的方法
		     byte[] b = new byte[1024];
		     int len;
		     while((len =is.read(b)) != -1){
		     	os.write(b,0,len);
			 }
			 os.close();
		     is.close();


	}
		/**
		 * @Author Gabriel
		 * @Description //TODO 文件的上传
		 * @Date 2018/12/14
		 * @Param
		 * @Return
		 */
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 创建DiskFileItemFactory工程对象
		DiskFileItemFactory factory = new DiskFileItemFactory();


		// 使用ServletFileUpload构造器传入DiskFileItemFactory对象，来构建ServletFileUpload的对象。
		ServletFileUpload upload = new ServletFileUpload(factory);

		// 使用ServletFileUpload的对象中的parseRequest方法来解析 请求对象。
		try {
			List<FileItem> items = upload.parseRequest(req);
			//遍历所有的FileItem集合，  表单中一个控件就是一个FileItem对象
			for (FileItem item : items) {
				//需要判断每一个FileItem对象是一个普通的表单控件对象还是一个文件上传的对象
				if(item.isFormField()){//如果为true 表示是一个普通的表单控件
					System.out.println("getFieldName:"+item.getFieldName()); //获得控件的name的属性值
					System.out.println("getName:"+item.getName());
					System.out.println("getString:"+item.getString( "UTF-8")); //获得控件的value属性值
					System.out.println("-----------------------");
				}else{//如果判断条件为false  表示是一个文件控件  input  type=file
					System.out.println("false");
					System.out.println("getFieldName:"+item.getFieldName()); //获得控件的name的属性值
					System.out.println("getName:"+item.getName());
					System.out.println("getString:"+item.getString( "UTF-8")); //获得控件的value属性值
					System.out.println("getInputStream:"+item.getInputStream()); //获得控件的value属性值
					System.out.println("-----------------------");
					InputStream is = item.getInputStream();//上传的文件的输入流

					//需要把上传的文件保存到服务器的磁盘中。
					//OutputStream os = new FileOutputStream("d:/"+item.getName());

					ServletContext context = req.getServletContext();
					System.out.println("getRealPath:"+context.getRealPath("/bookImgCover")); //解析当前工程下一个资源在工程发布目录的决定地址。
					//上传到当前工程的bookImgCover目录下
					OutputStream os = new FileOutputStream(context.getRealPath("/bookImgCover")+"\\" +item.getName());

					byte[] b = new byte[1024];
					int len ;
					while((len = is.read(b)) !=-1){
						os.write(b,0,len);
					}

					os.close();
					is.close();

				}
			}
			

		} catch (FileUploadException e) {

		}
	}
}